//: Playground - noun: a place where people can play

import UIKit

//: # swfit 读书笔记

//: ## 类和结构体对比
/*
 Swift 中类和结构体有很多共同点。共同处在于：

定义属性用于存储值
定义方法用于提供功能
定义下标操作使得可以通过下标语法来访问实例所包含的值
定义构造器用于生成初始化值
通过扩展以增加默认实现的功能
实现协议以提供某种标准功能
更多信息请参见属性，方法，下标，构造过程，扩展，和协议。

与结构体相比，类还有如下的附加功能：

继承允许一个类继承另一个类的特征
类型转换允许在运行时检查和解释一个类实例的类型
析构器允许一个类实例释放任何其所被分配的资源
引用计数允许对一个类的多次引用
 
结构体总是通过被复制的方式在代码中传递，不使用引用计数
 */

//: ### 定义语法 类和结构体有类似的定义方式 ， 类 class 结构体 struct
//: 格式要求 类名和结构体名 首字母大写， 但是属性和方式 第一个字母小写，其他单词首字母大写

class someClass {
    //: 类
}

struct someStruct {
    //: 结构体
}

//: ## 结构体和枚举是值类型  意思是它们在传递过程中是通过值copy 来实现的， 并不是通过指针

print("_____________________结构体和枚举是值类型_____________________________");

struct HTIosDeveloper{
    var name:String
    var Age:Int = 0
    var gender:String?
}
let iosOne = HTIosDeveloper (name: "程咬金", Age: 20, gender: "男")

var tempIosOne = iosOne
tempIosOne.gender = "女"

//: iosOne 不会因为 tempIosOne 改变而改变，因为它们指向了不同的内存。
print("iosOne - \(iosOne)\ntempIosOne - \(tempIosOne)")


enum HTAndriodDeveloper{
    case javaBackGround,HTML
}

var andriodOne = HTAndriodDeveloper.javaBackGround

let tempAndriodOne = andriodOne;
andriodOne = .HTML

//: tempAndriodOne 的改变也没有 andriodOne
if tempAndriodOne == HTAndriodDeveloper.javaBackGround {
    print("我是从事 - \(tempAndriodOne)")
}

//: ## 类是引用类型:与值类型不同，引用类型在被赋予到一个变量、常量或者被传递到一个函数时，其值不会被拷贝。因此，引用的是已存在的实例本身而不是其拷贝。

//: ### 恒等运算符:
//: (===)等价于”表示两个类类型（class type）的常量或者变量引用同一个类实例。
//: (==)等于”表示两个实例的值“相等”或“相同”，判定时要遵照设计者定义的评判标准，因此相对于“相等”来说，这是一种更加合适的叫法




//: ## 类和结构体的选择：结构体实例总是通过值传递，类实例总是通过引用传递。这意味两者适用不同的任务

/*
 按照通用的准则，当符合一条或多条以下条件时，请考虑构建结构体：
 
 1.该数据结构的主要目的是用来封装少量相关简单数据值。
 2.有理由预计该数据结构的实例在被赋值或传递时，封装的数据将会被拷贝而不是被引用。
 3.该数据结构中储存的值类型属性，也应该被拷贝，而不是被引用。
 4.该数据结构不需要去继承另一个既有类型的属性或者行为。
 
 
 举例来说，以下情境中适合使用结构体：
 
 几何形状的大小，封装一个width属性和height属性，两者均为Double类型。
 一定范围内的路径，封装一个start属性和length属性，两者均为Int类型。
 三维坐标系内一点，封装x，y和z属性，三者均为Double类型。
 在所有其它案例中，定义一个类，生成一个它的实例，并通过引用来管理和传递。实际中，这意味着绝大部分的自定义数据构造都应该是类，而非结构体。
 
 */

//: ## 字符串、数组、和字典类型的赋值与复制行为
/*
Swift 中，许多基本类型，诸如String，Array和Dictionary类型均以结构体的形式实现。这意味着被赋值给新的常量或变量，或者被传入函数或方法中时，它们的值会被拷贝。

Objective-C 中NSString，NSArray和NSDictionary类型均以类的形式实现，而并非结构体。它们在被赋值或者被传入函数或方法时，不会发生值拷贝，而是传递现有实例的引用。
*/
